home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-0039 / source / dccnvimg.mod < prev    next >
Text File  |  1997-04-16  |  9KB  |  273 lines

  1. IMPLEMENTATION MODULE DCCnvImg;
  2.  
  3. (*---------------------------------------------------------------------*)
  4. (*   Convert Rectangular portion of the picture.                       *)
  5. (*                                                                     *)
  6. (*   The information for the conversion came from Personal Computer    *)
  7. (*   World Magazine - July 1988. And examining the output of the       *)
  8. (*   snapshot utility provided with 1st Word Plus ( Version 3, nice! ).*)
  9. (*                                                                     *)
  10. (*   Any faults with the implementation are, as usual, all mine.       *)
  11. (*                                                                     *)
  12. (*   In my usual fashion, the coding will be very simple in this       *)
  13. (*   version. Specifically, when a scan line is all off or on, it will *)
  14. (*   be coded using 'SOLID_RUN' otherwise it is coded as a             *)
  15. (*   'BIT_STRING'. The idea is to arrange for DTP packages to read     *)
  16. (*   the image, not encode it in a compressed form.                    *)
  17. (*   Well... maybe some compression.                                   *)
  18. (*                                                                     *)
  19. (*   Version 1.00     November 1988                    L.G.Miller      *)
  20. (*---------------------------------------------------------------------*)
  21.  
  22.  
  23. (*  IMPORT  Trace; *)
  24.  
  25. FROM    SYSTEM                  IMPORT WORD, ADDRESS, ADR, BYTE;
  26.  
  27.  
  28. FROM    DCGlobal                IMPORT PictureImage,
  29.                                        HiRes, MedRes,
  30.                                        MedResMaxX, MedResMaxY,
  31.                                        HiResMaxX,  HiResMaxY,
  32.                                        HiResScreen,
  33.                        BITSPERWORD;
  34.  
  35. FROM   DCQuickFunctions        IMPORT TestBit, SetBit, LUDivRem;
  36.  
  37. FROM   Graphics         IMPORT graf_mouse;
  38.  
  39. FROM   ManyWindows      IMPORT HideMouse,
  40.                                ShowMouse;
  41.  
  42. CONST
  43.        CMaxScanLen     = 80; (* bytes *)
  44.        Arrow           =  0;
  45.        HourGlass       =  2;
  46.  
  47.  
  48. TYPE
  49.         CharPtr = POINTER TO CHAR;
  50.  
  51.         IMGHeader =
  52.           RECORD
  53.             VersionNo,                          (* constant  1          *)
  54.             HeaderLength,                       (* 8 words              *)
  55.             NoPlanes,                           (* 1 - mono             *)
  56.             PatternLength,                      (* 2 words              *)
  57.             SPixelWidth,                        (* Source Pixel Width   *)
  58.             SPixelHeight,                       (* Dest Pixel Width     *)
  59.             ScanPixelWidth,                     (* Scan width in pixels *)
  60.             ScanLineDepth                       (* No. Of Lines Deep    *)
  61.                   : INTEGER;  (* 16 bits *)
  62.           END;
  63.  
  64.  
  65.  
  66. (*----------------------------------------------------------------------*)
  67. (*                                                                      *)
  68. (*----------------------------------------------------------------------*)
  69.  
  70.  
  71. PROCEDURE QueryPicturePixel(     x, y : INTEGER ; (* co-ords *)
  72.                              VAR pic  : HiResScreen ) : BOOLEAN;
  73.   BEGIN
  74.     RETURN TestBit( x, pic[y] );
  75.   END QueryPicturePixel;
  76.  
  77.  
  78. PROCEDURE QueryAllOnOff( VAR X, Y, W : INTEGER;
  79.                          VAR SLine : ARRAY OF CHAR;
  80.                          VAR Pic   : HiResScreen ) : INTEGER;
  81.  
  82.   VAR i, CountOn, CountOff, bitno : INTEGER;
  83.  
  84.   BEGIN
  85.     FOR i := 0 TO CMaxScanLen-1 DO SLine[i] := CHAR(0) END;
  86.     CountOn  := 0;
  87.     CountOff := 0;
  88.     bitno    := 0;
  89.     FOR i := X TO X + W - 1 DO
  90.        IF QueryPicturePixel(i, Y, Pic ) THEN
  91.           SetBit(bitno, SLine);
  92.           INC(CountOn);
  93.        ELSE
  94.           INC(CountOff)
  95.        END; (* if *)
  96.        INC(bitno);
  97.     END; (* for i *)
  98.     IF ( CountOn # 0 ) AND ( CountOff # 0 ) THEN
  99.       RETURN( 0 );
  100.     ELSIF CountOn # 0 THEN
  101.       RETURN ( 1 )
  102.     ELSE
  103.       RETURN ( -1 )
  104.     END;
  105.   END QueryAllOnOff;
  106.  
  107.  
  108.  
  109. PROCEDURE OnOrOffLength(     SIndex, SLen : INTEGER;
  110.                          VAR SLine : ARRAY OF CHAR ) : INTEGER;
  111.   VAR len      : INTEGER;
  112.       LikeByte : CHAR;
  113.   BEGIN
  114.     len := 0;
  115.     LikeByte := CHAR(SLine[SIndex]);
  116.     IF  ( LikeByte # CHAR(0)   )
  117.     AND ( LikeByte # CHAR(255) ) THEN
  118.       RETURN len
  119.     END; (* if *)
  120.  
  121.     WHILE ( SIndex < SLen                  )
  122.      AND  ( SLine[SIndex] = LikeByte ) DO
  123.         INC(len);
  124.         INC(SIndex);
  125.     END; (* while *)
  126.     RETURN len
  127.   END OnOrOffLength;
  128.  
  129.  
  130. PROCEDURE NotOnOrOffLength(     SIndex, SLen : INTEGER;
  131.                             VAR SLine : ARRAY OF CHAR ) : INTEGER;
  132.  
  133.   VAR len : INTEGER;
  134.   BEGIN
  135.     len := 0;
  136.  
  137.     WHILE  ( SIndex < SLen              )
  138.      AND   ( SLine[SIndex] > CHAR(0)    )
  139.      AND   ( SLine[SIndex] < CHAR(255)  ) DO
  140.         INC(len);
  141.         INC(SIndex);
  142.     END; (* while *)
  143.     RETURN len
  144.   END NotOnOrOffLength;
  145.  
  146.  
  147.  
  148. PROCEDURE CompressScanLine(     SLen     : INTEGER;
  149.                             VAR SLine    : ARRAY OF CHAR;
  150.                             VAR OFileLen : CARDINAL;
  151.                             VAR OFilePtr : CharPtr );
  152.  
  153.   VAR i, j, len : INTEGER;
  154.  
  155.   BEGIN
  156.     i  := 0;
  157.     WHILE i < SLen DO
  158.  
  159.       len := OnOrOffLength( i, SLen, SLine );
  160.       IF (    ( len > 0 )
  161.            OR ( (i+len) >= SLen ) ) THEN
  162.          IF ( SLine[i] = CHAR(0) ) THEN
  163.            OFilePtr^ := CHR(len);
  164.          ELSE
  165.            OFilePtr^ := CHR(len+128);
  166.          END; (* if *)
  167.          OFilePtr := ADDRESS(LONGCARD(OFilePtr) + LONGCARD(1));
  168.          INC(OFileLen);
  169.          INC(i,len);
  170.  
  171.       ELSE
  172.  
  173.          len := NotOnOrOffLength( i, SLen, SLine );
  174.          OFilePtr^ := CHR(80H);
  175.          OFilePtr := ADDRESS(LONGCARD(OFilePtr) + LONGCARD(1));
  176.          INC(OFileLen);
  177.          OFilePtr^ := CHR(len);
  178.          OFilePtr := ADDRESS(LONGCARD(OFilePtr) + LONGCARD(1));
  179.          INC(OFileLen);
  180.          FOR j := 1 TO len DO
  181.            OFilePtr^ := SLine[i];
  182.            OFilePtr := ADDRESS(LONGCARD(OFilePtr) + LONGCARD(1));
  183.            INC(OFileLen);
  184.            INC(i);
  185.          END; (* for j *)
  186.  
  187.       END; (* if *)
  188.  
  189.     END; (* while i *)
  190.  
  191.   END CompressScanLine;
  192.  
  193.  
  194.  
  195. PROCEDURE ConvertToImage ( VAR PicImageDetails : PictureImage;
  196.                            VAR Picture         : HiResScreen;
  197.                            VAR OutLen          : CARDINAL;
  198.                            VAR OutFile         : ADDRESS );
  199.  
  200.   VAR i, j, AllOnOff    : INTEGER;
  201.       SWBytes           : INTEGER;              (* Scan Width In Bytes *)
  202.       IMGPtr, IMGDetPtr : CharPtr;              (* cheat time *)
  203.       ScanLine          : ARRAY [ 0 .. 80 ] OF CHAR;
  204.       IMGHeadDet        : IMGHeader;
  205.   BEGIN
  206.     HideMouse;
  207.     i := graf_mouse(HourGlass, NIL);
  208.     ShowMouse;
  209.  
  210.     OutLen := 0;
  211.     IMGPtr := OutFile;
  212.     IMGDetPtr := ADR(IMGHeadDet);
  213.     WITH IMGHeadDet  DO
  214.        VersionNo      := 1;                 (* constant  1          *)
  215.        HeaderLength   := 8;                 (* 8 words              *)
  216.        NoPlanes       := 1;                 (* 1 - mono             *)
  217.        PatternLength  := 2;                 (* 2 words              *)
  218.        SPixelWidth    := 170;               (* Source Pixel Width   *)
  219.        SPixelHeight   := 170;               (* Dest Pixel Width     *)
  220.        ScanPixelWidth := PicImageDetails.Width;
  221.                                             (* Scan width in pixels *)
  222.        ScanLineDepth  := PicImageDetails.Height;
  223.                                             (* No. Of Lines Deep    *)
  224.     END; (* with *)
  225.     FOR i := 1 TO 16 DO
  226.        IMGPtr^ := IMGDetPtr^;
  227.        IMGPtr  := ADDRESS(LONGCARD(IMGPtr)+LONGCARD(1));
  228.        IMGDetPtr := ADDRESS(LONGCARD(IMGDetPtr)+LONGCARD(1));
  229.     END;
  230.     OutLen := 16;
  231.  
  232.     WITH PicImageDetails DO
  233.       IF (Width MOD 8) = 0 THEN
  234.          SWBytes:= (Width DIV 8);  (* exact no. bytes *)
  235.       ELSE
  236.          SWBytes:= (Width DIV 8) + 1;
  237.       END; (* if *)
  238.  
  239.       FOR i := 0 TO Height-1 DO
  240.         j := StartY + i;
  241.         AllOnOff := QueryAllOnOff( StartX, j, Width,
  242.                                    ScanLine,
  243.                                    Picture );
  244.         IF AllOnOff # 0 THEN                   (* 0 is mixture of on/off *)
  245.            IF AllOnOff > 0 THEN                (* all on                 *)
  246.               IMGPtr^ := CHR(SWBytes+128);
  247.               IMGPtr  := ADDRESS(LONGCARD(IMGPtr)+LONGCARD(1));
  248.               INC(OutLen);
  249.  
  250.            ELSE
  251.               IMGPtr^ := CHR(SWBytes);
  252.               IMGPtr  := ADDRESS(LONGCARD(IMGPtr)+LONGCARD(1));
  253.               INC(OutLen);
  254.            END; (* if *)
  255.         ELSE
  256.            CompressScanLine( SWBytes, ScanLine, OutLen, IMGPtr );
  257.  
  258.         END; (* if *)
  259.  
  260.       END; (* for i *)
  261.  
  262.     END; (* with *)
  263.     HideMouse;
  264.     i := graf_mouse(Arrow, NIL);
  265.     ShowMouse;
  266.   END ConvertToImage;
  267.  
  268. END DCCnvImg.
  269.  
  270.  
  271.  
  272.  
  273.